package meow.async

import meow.Timeline
import meow.Followers
import meow.Account

/** タイムラインの更新をおこなう非同期サービス  */
class TimelineService {
  boolean transactional = true
  static expose = ['jms']
  static destination = "queue.timeline"

  def onMessage = {status ->
    log.info "==== async ${status.account.username} timeline===="
    try {
      // 送らなくていい人リスト
      def noSenders = [] as Set

      // リプライ先のタイムラインにも反映させる（これは遅延していい）
      status.replies().each {address ->
        // 実在確認しとくか...
        if (Account.findByUsername(address)) {
          log.info "${address} のタイムライン反映させるよ"
          new Timeline(ownername: address,
                       status: status, statusOwner: status.account,
                       createDate: status.dateCreated).save()
          noSenders << address
        }
      }

      log.info "送らなくていい人リスト(${noSenders ? 't' : 'f'}):${noSenders}"

      // 自分をフォローしてくれている人たちのタイムラインに投稿を反映させる
      Followers.followersList(status.account.username).each {
        def ownername = it.owner.username
        log.info "follower -> ${ownername}"
        // リプライメッセージの場合，その人がフォローしてない相手へのメッセージは送らない
        boolean flag = true
        if (noSenders) {
          if (noSenders.contains(ownername)) {
            log.info "すでにタイムライン反映済み"
            flag = false
          }
          else {
            if (Followers.withCriteria {
                projections { rowCount() }
                owner { eq 'username', ownername }
                target { 'in' 'username', noSenders }
                }[0] == 0) {
              log.info "フォローしてない人宛のメッセージはタイムラインに反映しない:${cnt}"
              flag = false
            }
          }
        }
        if (flag) {
          log.info "タイムラインに反映"
          new Timeline(ownername: ownername,
                       status: status, statusOwner: status.account,
                       createDate: status.dateCreated).save()
        }
      }
    }
    catch (e) { e.printStackTrace() }
    log.info "==== ASYNC TIMELINE ===="
  }
}
